/* 
包含姓名、年龄、电话号码、性别 
菜单--选择：新建立联系人、删除、修改
*/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "phoneContact.h"

/* 状态码 */
enum STATUS_CODE  
{  
    ON_SUCCESS,  
    MALLOC_ERROR,  
    NULL_PTR,  
    INVALID_ACCESS,  
};

/* 静态前置声明 */
/* 确定修改信息 */
static int modifyInfo1(contact *phone);
/* 比较获取位置 */
static int compareGetPos(contact *phone, char *names);
/* 菜单选择 */
//static int selectMenu(contact *phone, int inPut);
/* 选择修改信息 */
static int selectModifyInfo1(contact *phone, int pos);
/* 判空 */
static int judgeEmpty(contact *phone);
/* 名字排序 */
static char compareSort(contact *phone);
/* 打印 */
static int  printfInfo(contact *phone);

/* 选择修改信息 */
static int selectModifyInfo1(contact *phone, int pos)
{
    switch (pos)
    {
    case 1://修改名字
        printf("请输入新名字：");
        /* 减去1因为数组索引从0开始，限制输入长度为8防止溢出 */
        scanf("%8s", phone->data[pos-1].name);
        break;
    case 2://修改性别
        printf("请更改性别：");
        scanf("%4s", phone->data[pos-1].sex);
        break;
    case 3://修改年龄
        printf("请更改年龄：");
        scanf("%d", &(phone->data[pos-1].age));
        break;
    case 4://修改电话号码
        printf("请输入新号码：");
        scanf("%14ls", phone->data[pos-1].nums);
        break;
    default:
        break;
    }
}

/* 比较确定是否存在，带出位置 */
static int compareGetPos(contact *phone, char *names)
{
    for(int idx = 0; idx < phone->size; idx++)
    {
        if(strcmp(phone->data[idx].name, names) == 0)
        {
            return idx;
        }
    }
    printf("信息错误，不存在该联系人\n");
    return 0;
}

/* 修改信息且带出位置 */
static int modifyInfo1(contact *phone)
{
    char names;
    printf("请输入要修改联系人的名字：");
    scanf("%c", &names);
    if(names != ' ')
    {
        /* 比较，带出位置 */
        int pos = compareGetPos(phone, &names);
        /* 信息修改菜单 */
        menu1(phone);
        /* 选择修改信息 */
        selectModifyInfo1(phone, pos);
        /* 修改后要不要显示一下信息 */
    }
}

/* 判空 */
static int judgeEmpty(contact *phone)
{
    if(phone->size == 0)
    {
        printf("通讯录为空，操作失败\n");
        /* 为空结束程序 */
        exit(-1);           
    }
    return 0;    
}

/* 对年龄进行排序 */
static char compareSort(contact *phone)
{
    /* 插入排序 */
    /* 插入排序从一开始 */
    //  peoInfo copyChar;
    // for(int idx = 1; idx < phone->size; idx++)
    // {
    //     /* 索引备份 */
    //     int preIdx = idx - 1;
    //     /* 数据备份随时存在 */
    //     copyChar = phone->data[idx];
    //     while(strcmp(phone->data[preIdx].name, copyChar.name) > 0 && preIdx >= 0)
    //     {
    //         strcpy(phone->data[preIdx + 1].name, phone->data[preIdx].name);
    //         preIdx--;
    //     }
    //     phone->data[preIdx + 1] = copyChar;
    // }
    // printf("排序后：%s\n");

    /* 冒泡排序 */
    peoInfo p;
    int jdx = 0;
    for(jdx = 0; jdx < phone->size; jdx++)
    {
        int idx = 0;
        for(idx = 0; idx < phone->size - 1 - jdx; idx++)
        {
            p = phone->data[idx];
            phone->data[idx] = phone->data[idx + 1];
            phone->data[idx+1] = p;
        }
    }
}

/* 打印 */
static int printfInfo(contact *phone)
{
    for(int idx = 0; idx < phone->size; idx++)
    {
        printf("%8s\n", phone->data[idx].name);
        printf("%4s\n", phone->data[idx].sex);//想不通
        printf("%d\n", phone->data[idx].age);
        printf("%14ls\n", phone->data[idx].nums);        
    }
    return 0;
}

/* 菜单 */
int menu(contact *phone)
{ 
    printf("1.新建立联系人            2.修改信息\n");
    //printf("2.修改信息\n");
    printf("3.删除联系人              4.查找联系人\n");
    //printf("4.查找联系人\n");
    printf("5.排序                   6.显示所有联系人\n");
    //printf("6.显示所有联系人\n");
    printf("7.退出\n");

    return ON_SUCCESS;
}

/* 信息修改菜单 */
int menu1(contact *phone)
{ 
    printf("1.修改名字              2.修改性别\n");
    //printf("2.修改信息\n");
    printf("3.修改年龄              4.修改电话号码\n");
}

/* 菜单选择 */
int selectMenu(contact *phone, int inPut)
{
    switch (inPut)
    {
    case 1://新建立联系人
        newCreate(phone);//不知道传入应该是啥
        break;
    case 2://修改信息
        modifyInfo(phone);
        break;
    case 3://删除联系人
        deleteInfo(phone);
        break;
    case 4://查找
        seekInfo(phone);
        break;
    case 5://排序
        nameSort(phone);
        break;
    case 6://显示
        showInfo(phone);
        break;        
    case 7://退出
        exitphone(phone);
        break;

    default:
        break;
    }
}

/* 初始化 */
int phoneContactInit(contact **pPhone)
{
    contact *phone = malloc(sizeof(contact) * BUFFER_SIZE);
    if(phone == NULL)
    {
        return MALLOC_ERROR;
    }
    memset(phone, 0, sizeof(contact) * BUFFER_SIZE);
    phone->size = 0;

    *pPhone = phone;
    
    return ON_SUCCESS;
}

/* 新建立联系人 */
int newCreate(contact *phone)
{
    /* 如果人已经存在了呢 */
    /* 判满 */
    if(phone->size == BUFFER_SIZE)
    {
		printf("通讯录已满，无法添加\n");
		return 0;           
    }
#if 0
	printf("请输入联系人名字:");
	scanf("%8s", phone->data[phone->size].name);
	printf("请输入联系人的性别:");
	scanf("%4s", phone->data[phone->size].sex);   
    printf("请输入联系人的年龄:");
	scanf("%4d", &(phone->data[phone->size].age));
    printf("请输入联系人的号码:");
	scanf("%14ls", phone->data[phone->size].nums);
#endif

    printf("请输入联系人名字: ");  
    if (scanf("%19s", phone->data[phone->size].name) != 1)
    {  
        printf("输入名字失败\n");  
        return -1;  
    }  
  
    printf("请输入联系人的性别: ");  
    if (scanf("%1s", phone->data[phone->size].sex) != 1) 
    {  
        printf("输入性别失败\n");  
        return -1;  
    }  
  
    printf("请输入联系人的年龄: ");  
    if (scanf("%d", &(phone->data[phone->size].age)) != 1)
    {  
        printf("输入年龄失败\n");  
        return -1;  
    }  
  
    printf("请输入联系人的号码: ");  
    if (scanf("%14s", phone->data[phone->size].nums) != 1) 
    {  
        printf("输入号码失败\n");  
        return -1;  
    } 
    /* 个数增加1 */
    (phone->size)++;

    printf("添加完成\n");
    return 0;
}

/* 修改信息 */
int  modifyInfo(contact *phone)
{
    char ch;
    printf("是否确认修改(是/否)：");

    /* 清除输入缓冲区中的旧数据 */
    while ((ch = getchar()) != '\n' && ch != EOF);  
    scanf("%s", &ch);
    if(strcmp(&ch, "是") == 0)//不可ch == "是",都是字符串
    {
        /* 判空 */
        judgeEmpty(phone);
        modifyInfo1(phone);
    }
    else
        return 0;
}

/* 删除联系人 */
int deleteInfo(contact *phone)
{
    char names;
    /* 判空 */
    judgeEmpty(phone);
    printf("请输入需要删除的人的名字：");
    scanf("%s", &names);
    for(int idx = 0; idx < phone->size; idx++)
    {
        int jdx = 0;
        /* 确定需要删除的信息是否存在,且带出位置 */
        int pos = compareGetPos(phone, &names);
        for(jdx = pos + 1; jdx < phone->size; jdx++)
        {
            phone->data[jdx - 1] = phone->data[jdx];
        }
        /* 
        直接覆盖
        此处个数减少一个,也把末尾的丢了，各个属性不用置空
        */
        (phone->size)--;
    }
    /* 程序到此说明联系人不存在 */
    printf("联系人不存在，无法删除\n");
    return 0;
}

/* 查找联系人 */
int seekInfo(contact *phone)
{
    char names;
    printf("请输入需要查找的联系人名字：");
    scanf("%8s", &names);//限制输入长度为8，防止溢出
    /* 确定是否存在,存在输出所有信息 */
    /* 判空 */
    judgeEmpty(phone);
    /* 优化是弄出去，太长了 */
    /* 查询且带出位置 */
    int ret = compareGetPos(phone, &names);
    if(ret != 0)
    {
        /* 存在此人 */
        printf("联系人存在\n");
        printf("%8s\n", phone->data[ret-1].name);
        printf("%4s\n", phone->data[ret-1].sex);
        printf("%d\n", phone->data[ret-1].age);
        printf("%14ls\n", phone->data[ret-1].nums);
    }
    else
    {
        printf("联系人不存在\n");
    }

    return 0;
}

/* 按名字排序 */
int nameSort(contact *phone)
{
    /* 判空 */
    judgeEmpty(phone);
    /* 按名字进行排序 */
    compareSort(phone);
    /* 打印 */
    printfInfo(phone);
    return 0;
}

/* 显示所有联系人 */
int showInfo(contact *phone)
{
    /* 判空 */
    judgeEmpty(phone);
    /* 打印 */  
    printfInfo(phone); 
}

/* 退出 */
int exitphone(contact *phone)
{
    exit(-1);
}
